package com.xzc.lease.web.admin.custom.interceptor;

import com.xzc.lease.common.login.LoginUserHolder;
import com.xzc.lease.common.utils.JwtUtil;
import com.xzc.lease.common.login.LoginUser;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * @author 徐生
 * 2024/10/12
 * description: 拦截所有的controller，校验token
 */
@Component
@Slf4j
public class AuthenticationInterceptor implements HandlerInterceptor {

    //在拦截的方法执行之前，先执行一次该方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("Admin：拦截前端请求, 校验token, 保存用户信息。");
        //获取请求头中的token信息，参数需要和前端协商决定
        String token = request.getHeader("access-token");

        //校验token，并把登录的用户信息保存在ThreadLocal中
        Claims claims = JwtUtil.parseToken(token);
        Long userId = claims.get("userId", Long.class);
        String username = claims.get("username", String.class);
        LoginUserHolder.setLoginUser(new LoginUser(userId, username));

        //返回true表示放行，false不放行
        return true;
    }

    //在拦截的方法执行后，执行一次该方法
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("Admin：清除ThreadLocal中的用户信息");
        //由于SpringMVC使用了线程池技术，当一个线程处理完之后，线程不会被销毁，
        //   而是会回到线程池当中，等待处理下一个请求。为了保证用户信息不错乱，需要清理用户信息
        LoginUserHolder.clear();
    }
}
